28.3.1 客户端

为了将web-app放入一个OAuth2客户端,你只需注解@EnableOAuth2Client,Spring Boot会创建OAuth2ClientContextOAuth2ProtectedResourceDetails,这些是创建OAuth2RestOperations必需的。Spring Boot不会自动创建该bean,但你自己创建也不费力:

@Bean
public OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext,
        OAuth2ProtectedResourceDetails details) {
    return new OAuth2RestTemplate(details, oauth2ClientContext);
}

你可能想添加一个限定名(qualifier),因为应用中可能定义多个RestTemplate

该配置使用security.oauth2.client.*作为证书(跟授权服务器使用的相同),此外,它也需要知道授权服务器中认证和token的URIs,例如:

security:
    oauth2:
        client:
            clientId: bd1c0a783ccdd1c9b9e4
            clientSecret: 1a9030fbca47a5b2c28e92f19050bb77824b5ad1
            accessTokenUri: https://github.com/login/oauth/access_token
            userAuthorizationUri: https://github.com/login/oauth/authorize
            clientAuthenticationScheme: form

具有该配置的应用在使用OAuth2RestTemplate时会重定向到GitHub以完成授权,如果已经登陆GitHub,你甚至不会注意到它已经授权过了。那些特殊的凭证(credentials)只在应用运行于8080端口时有效(为了更灵活,在GitHub或其他提供商上注册自己的客户端app)。

在客户端获取access token时,你可以设置security.oauth2.client.scope(逗号分隔或一个YAML数组)来限制它请求的作用域(scope)。作用域默认是空的,默认值取决于授权服务器,通常依赖于它拥有的客户端在注册时的设置。

security.oauth2.client.client-authentication-scheme也有设置,默认为"header"(如果你的OAuth2提供商不喜欢header认证,例如Github,你可能需要将它设置为“form”)。实际上,security.oauth2.client.*属性绑定到一个AuthorizationCodeResourceDetails实例,所以它的所有属性都可以指定。

在一个非web应用中,你仍旧可以创建一个OAuth2RestOperations,并且跟security.oauth2.client.*配置关联。在这种情况下,它是一个“client credentials token grant”,如果你使用它的话就需要获取(此处不需要注解@EnableOAuth2Client@EnableOAuth2Sso)。为了防止基础设施定义,只需要将security.oauth2.client.client-id从配置中移除(或将它设为空字符串)。